package com.obelisco.modelo.servicios.seguridad;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.hibernate.ObjectNotFoundException;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.obelisco.exception.ObeliscoException;
import com.obelisco.modelo.beans.OrientacionMenu;
import com.obelisco.modelo.dao.ICarpetaTransaccionDAO;
import com.obelisco.modelo.dao.IGrupoDAO;
import com.obelisco.modelo.dao.IUsuarioDAO;
import com.obelisco.modelo.dao.hibernate.GrupoDAO;
import com.obelisco.modelo.dao.hibernate.SistemaDAO;
import com.obelisco.modelo.data.CarpetaTransaccion;
import com.obelisco.modelo.data.DataGenerica;
import com.obelisco.modelo.data.Grupo;
import com.obelisco.modelo.data.Sistema;
import com.obelisco.modelo.data.Transaccion;
import com.obelisco.modelo.data.Usuario;

public class ServicioAutenticarUsuario implements IServicioAutenticarUsuario {

	private IUsuarioDAO usuarioDAO;

	private ICarpetaTransaccionDAO carpetaTransaccionDAO;
	
	private IServicioSeguridad servicioSeguridad;

	Sistema sistema;
	
	// Agregados por Edgar pastran
	private GrupoDAO grupoDAO;
	private SistemaDAO sistemaDAO;
	

	private void cargarTransacciones(Usuario usuario) {
		CarpetaTransaccion carpetaRaiz = carpetaTransaccionDAO
				.findTree(sistema,usuario);
		usuario.setFunciones(carpetaRaiz);
	}
	
	private Sistema buscarSistema() {
		List sistemas = this.sistemaDAO.findAll(Sistema.class);
		if ((sistemas != null) && (sistemas.size() > 0))
			return (Sistema)sistemas.get(0);
		return null;
	}
	
	private Grupo buscarGrupoEncuestados() {
		List criterios = new ArrayList();
		criterios.add(Restrictions.eq("id.sistema", this.buscarSistema()));
		criterios.add(Restrictions.eq("id.nombre", Grupo.GRUPO_ENCUESTADOS));
		List grupos = this.grupoDAO.findByCriterions(Grupo.class, criterios);
		if ((grupos != null) && (grupos.size() > 0))
			return (Grupo)grupos.get(0);
		return null;
	}
	
	public Usuario validarCredenciales(String login, String password)
			throws ObeliscoException {
		Usuario usuario = null;
		try {			
			List usuarios = getUsuarioDAO().findByProperty("login", login);
			if ((usuarios != null) &&
				(usuarios.size() > 0)) {
				usuario = (Usuario)usuarios.get(0); 
			}
			if (usuario == null) {				
				throw new ObeliscoException(
				"Credenciales de Usuario Incorrectas");
			}
			else if	(usuario.getEstado().equals("B")
					|| usuario.getEstado().equals("L")) {
				throw new ObeliscoException(
						"Credenciales de Usuario Incorrectas");
			} else if (!usuario.getContrasena().equals(password)) {
				throw new ObeliscoException(
						"Credenciales de Usuario Incorrectas");
			}
			cargarTransacciones(usuario);
			//cargarTransaccionesPreferidas(usuario);
		} catch (ObeliscoException ex) {			
			ex.printStackTrace();
			usuario = null;
		}
		catch (Exception ex) {
			ex.printStackTrace();
			usuario = null;
		}
		return usuario;
	}


	public Sistema getSistema() {
		return sistema;
	}

	public void setSistema(Sistema sistema) {
		this.sistema = sistema;
	}

	public ICarpetaTransaccionDAO getCarpetaTransaccionDAO() {
		return carpetaTransaccionDAO;
	}

	public void setCarpetaTransaccionDAO(
			ICarpetaTransaccionDAO carpetaTransaccionDAO) {
		this.carpetaTransaccionDAO = carpetaTransaccionDAO;
	}

	public IUsuarioDAO getUsuarioDAO() {
		return usuarioDAO;
	}

	public void setUsuarioDAO(IUsuarioDAO usuarioDAO) {
		this.usuarioDAO = usuarioDAO;
	}

	public IServicioSeguridad getServicioSeguridad() {
		return servicioSeguridad;
	}

	public void setServicioSeguridad(IServicioSeguridad servicioSeguridad) {
		this.servicioSeguridad = servicioSeguridad;
	}
	
	public GrupoDAO getGrupoDAO() {
		return grupoDAO;
	}

	public void setGrupoDAO(GrupoDAO grupoDAO) {
		this.grupoDAO = grupoDAO;
	}

	public SistemaDAO getSistemaDAO() {
		return sistemaDAO;
	}

	public void setSistemaDAO(SistemaDAO sistemaDAO) {
		this.sistemaDAO = sistemaDAO;
	}

}
